#ifndef NETWORKINTERFACE_H
#define NETWORKINTERFACE_H

#include <QAbstractSocket>
#include <QObject>
#include <QString>

//这个通信接口可以通过多态的方式来指向不同的子类对象。
//因此我们后续还会定义一个模块工厂，通过该工厂来创建模块
//这个工厂会有这个通信接口，和一个抽象工厂
//通过这个通信接口可以根据需求创建不同的底层通信。
//通过模块的抽象工厂可以创建不同的模块。
//所以说还需要写一个模块接口，通过通信接口来定义不同的通信，通过模块接口来定义不同的模块。
//通过抽象工厂来构建不同的模块。例如抽象工厂的作用就是创建通信，和创建模块的。
//具体的工厂里面使用通信接口和模块接口来创建不同的模块。然后使用这个具体的通信链路和模块，来组成一个完成的模块。
//前提是需要把具体的模块需要使用到啥的先想好
//当数据接收完之后，发送信号给完整的产品，然后产品把数据交给模块处理。
class NetworkInterface : public QObject
{
    Q_OBJECT
public:
    NetworkInterface(const NetworkInterface &) = delete;
    NetworkInterface operator=(const NetworkInterface &) = delete;
    virtual ~NetworkInterface() = default;
    virtual void connect(const QString &hostAddress, const quint64 &hostPort) = 0;
    virtual void sendData(const QByteArray &data) = 0;
    virtual QByteArray readData(qint64 readBytes) = 0;
    virtual void disconnect() = 0;
    virtual QAbstractSocket::SocketState socketStatus() = 0;
signals:

protected slots:
    virtual void onConnected() = 0;
    virtual void onReadyRead() = 0;
    virtual void onError(QAbstractSocket::SocketError socketError) = 0;
    virtual void onDisconnected() = 0;

protected:
    explicit NetworkInterface() = default;
};

#endif
